﻿	;
[FORMAT "WCOFF"]			;制作目标文件的模式
[BITS 32]					;制作32位模式用的机器语言
[INSTRSET "i486p"]
;制作目标文件的信息
[FILE "naskfunc.nas"]
	GLOBAL 		_io_hlt,_io_cli,_io_sti,_io_stihlt
	GLOBAL 		_io_in8,_io_in16,_io_in32
	GLOBAL 		_io_out8,_io_out16,_io_out32
	GLOBAL 		_io_load_eflags,_io_store_eflags
	
;实际函数
[SECTION .txt]				;目标文件中写了这些后再写程序

_io_hlt:					; void io_hlt(void);
	hlt
	ret
	
_io_cli:					;void io_cli(void);
	cli
	ret

_io_sti:					;void io_sti(void);
	sti
	ret

_io_stihlt:					;void io_stihlt(void);
	sti
	hlt
	ret
	
_io_in8:					;int io_in8(int port);		//输入:从端口读取数据到eax
	mov 	edx,[esp+4]		;port
	mov 	eax,0
	in 		al,dx
	ret
	
_io_in16:
	mov 	edx,[esp+4]
	mov 	eax,0
	in 		ax,dx
	ret

_io_in32:
	mov 	edx,[esp+4]
	in 		eax,dx
	ret
	
_io_out8:					;void io_out8(int port,int data);
	mov 	edx,[esp+4]		;port
	mov 	al,[esp+8]		;data
	out 	dx,al
	ret

_io_out16:
	mov 	edx,[esp+4]
	mov 	eax,[esp+8]
	out 	dx,ax
	ret
	
_io_out32:
	mov 	edx,[esp+4]
	mov 	eax,[esp+8]
	out 	dx,eax
	
_io_load_eflags:			;int io_load_eflags(void);
	pushfd
	pop 	eax
	ret
	
_io_store_eflags:			;void io_store_eflags(int eflags);
	mov 	eax,[esp+4]
	push 	eax
	popfd
	ret
	